#ifndef __ELAPHURELINK_PROTOCOL_H__
#define __ELAPHURELINK_PROTOCOL_H__

#include <stdint.h>
#include <stddef.h>

// ElaphureLink协议标识符，用于标识协议数据包，固定值0x8a656c70
#define EL_LINK_IDENTIFIER 0x8a656c70

// ElaphureLink DAP版本号，0x10000表示v1.0.0版本，该版本支持厂商自定义命令
#define EL_DAP_VERSION 0x10000 // v1.0.0 support vendor command

// 握手命令标识，用于协议初始化阶段的握手通信
#define EL_COMMAND_HANDSHAKE 0x00000000

// 厂商自定义命令前缀，所有厂商命令以此为标识前缀
#define EL_VENDOR_COMMAND_PERFIX 0x88
// 原生命令透传标识，用于将原生命令直接传递
#define EL_NATIVE_COMMAND_PASSTHROUGH 0x1
// 进入厂商命令作用域标识，用于切换到厂商命令处理模式
#define EL_VENDOR_SCOPE_ENTER 0x2
// 退出厂商命令作用域标识，用于退出厂商命令处理模式
#define EL_VENDOR_SCOPE_EXIT 0x3

/**
 * @brief 握手请求数据包结构
 *
 * 用于客户端向服务端发送握手请求，包含协议标识、命令类型和代理版本信息
 * __attribute__((packed)) 用于取消结构体成员的内存对齐，保证数据紧凑存储
 */
typedef struct
{
    uint32_t el_link_identifier; // 协议标识符，必须为EL_LINK_IDENTIFIER
    uint32_t command;            // 命令类型，此处应为EL_COMMAND_HANDSHAKE
    uint32_t el_proxy_version;   // 客户端代理版本号
} __attribute__((packed)) el_request_handshake;

/**
 * @brief 握手响应数据包结构
 *
 * 用于服务端向客户端回复握手响应，包含协议标识、命令类型和DAP版本信息
 * __attribute__((packed)) 用于取消结构体成员的内存对齐，保证数据紧凑存储
 */
typedef struct
{
    uint32_t el_link_identifier; // 协议标识符，必须为EL_LINK_IDENTIFIER
    uint32_t command;            // 命令类型，此处应为EL_COMMAND_HANDSHAKE
    uint32_t el_dap_version;     // 服务端DAP版本号，对应EL_DAP_VERSION
} __attribute__((packed)) el_response_handshake;

/**
 * @brief ElaphureLink代理握手阶段处理函数
 *
 * 负责处理握手过程中的数据交互，验证协议标识和版本兼容性
 * @param fd 套接字文件描述符，用于握手数据的收发
 * @param buffer 数据包缓冲区，存储待处理的握手数据
 * @param len 数据包长度，缓冲区中有效数据的字节数
 * @return 0 表示握手成功，非0表示握手失败（具体错误码由实现定义）
 */
int el_handshake_process(int fd, void *buffer, size_t len);

/**
 * @brief 处理DAP数据并发送到套接字
 *
 * 对接收的DAP（调试访问端口）数据进行处理，并通过网络套接字发送
 * @param buffer DAP数据缓冲区，存储待处理的DAP数据
 * @param len DAP数据长度，缓冲区中有效数据的字节数
 */
void el_dap_data_process(void *buffer, size_t len);

/**
 * @brief 处理厂商自定义命令
 *
 * 解析并执行厂商自定义命令，根据请求数据生成响应数据
 * @param request 指向请求数据的指针，包含厂商命令及参数
 * @param response 指向响应数据的指针，用于存储命令执行结果
 * @return 32位无符号整数，表示命令执行状态（0通常表示成功，其他值表示错误）
 */
uint32_t el_vendor_command(const uint8_t *request, uint8_t *response);

/**
 * @brief DAP工作处理函数
 *
 * 处理DAP相关的核心业务逻辑，可能包括数据解析、命令执行等
 * @param base 指向数据缓冲区的基地址
 * @param len 数据长度，缓冲区中有效数据的字节数
 * @return 整数，表示处理结果（0通常表示成功，非0表示错误）
 */
int el_dap_work(uint8_t *base, size_t len);

/**
 * @brief 分配处理缓冲区
 *
 * 为协议处理过程分配必要的缓冲区内存，确保数据处理有足够的空间
 */
void el_process_buffer_malloc();

/**
 * @brief 释放处理缓冲区
 *
 * 释放之前通过el_process_buffer_malloc分配的缓冲区内存，避免内存泄漏
 */
void el_process_buffer_free();

#endif